Wang Haihua
🍈 🍉🍊 🍋 🍌
利用模块 sklearn. linear_model 中的函数 LinearRegression 可以求解 多元线性回归问题, 但模型检验只有一个指标 $R^{2}$, 需要用户编程实现模型 的其他统计检验。 构建并拟合模型的函数调用格式为 LinearRegression().fit( $(x, y)$ 其中 $x$ 为自变量观测值矩阵 (不包括全部元素为 1 的第一列), $y$ 为因变量 的观察值向量。
水泥凝固时放出的热量 $y$ 与水泥中 2 种主要化学成分 $x_{1}, x_{2}$ 有 关, 今测得一组数据如, 试确定一个线性回归模型 $y=a_{0}+a_{1} x_{1}+a_{2} x_{2}$ 。
序号 | x_(1) | x_(2) | y | 序号 | x_(1) | x_(2) | y |
---|---|---|---|---|---|---|---|
1 | 7 | 26 | 78.5 | 8 | 1 | 31 | 72.5 |
2 | 1 | 29 | 74.3 | 9 | 2 | 54 | 93.1 |
3 | 11 | 56 | 104.3 | 10 | 21 | 47 | 115.9 |
4 | 11 | 31 | 87.6 | 11 | 1 | 40 | 83.8 |
5 | 7 | 52 | 95.9 | 12 | 11 | 66 | 113.3 |
6 | 11 | 55 | 109.2 | 13 | 10 | 68 | 109.4 |
7 | 3 | 71 | 102.7 |
代码
求得的回归模型为: $$ y=52.5773+1.4683 x_{1}+0.6623 x_{2}, $$ 模型的复判定系数(也称为拟合优度) $R^{2}=0.9787$, 拟合效果很好。
statsmodels
库求解¶statsmodels
可以使用两种模式求解回归分析模型,一种是基于公式的模式,另一种是基于数组的模式。
基于公式构建并拟合模型的调用格式为:
import statsmodels as sm
sm.formula.ols(formula, data=df)
其中formula为引号括起来的公式,df为数据框或字典格式的数据。
基于数组构建并拟合模型的调用格式为:
import statsmodels.api as sm
sm.OLS(y,X).fit()
其中y为因变量的观察值向量,X为自变量观测值矩阵再添加第一列全部元素为1得到的增广阵。
代码
基于公式
import numpy as np; import statsmodels.api as sm
a=np.loadtxt("data/cement.txt")
#加载表中x1,x2,y的13行3列数据(数据见封底二维码)
d={'x1':a[:,0],'x2':a[:,1],'y':a[:,2]}
md=sm.formula.ols('y~x1+x2',d).fit() #构建并拟合模型
print(md.summary(),'\n------------\n') #显示模型所有信息
ypred=md.predict({'x1':a[:,0],'x2':a[:,1]}) #计算预测值
ypred=md.predict({'x1':a[:,0],'x2':a[:,1]}) #计算预测值
基于数组求解的Python程序如下:
import numpy as np; import statsmodels.api as sm
a=np.loadtxt("data/cement.txt")
#加载表中x1,x2,y的13行3列数据(数据见封底二维码)
X = sm.add_constant(a[:,:2]) #增加第一列全部元素为1得到增广矩阵
md=sm.OLS(a[:,2],X).fit() #构建并拟合模型
print(md.params,'\n------------\n') #提取所有回归系数
y=md.predict(X) #求已知自变量值的预测值
print(md.summary2()) #输出模型的所有结果
import numpy as np
from sklearn.linear_model import LinearRegression
a=np.loadtxt("data/cement.txt") #加载表中x1,x2,y的13行3列数据
md=LinearRegression().fit(a[:,:2],a[:,2]) #构建并拟合模型
y=md.predict(a[:,:2]) #求预测值
b0=md.intercept_; b12=md.coef_ #输出回归系数
R2=md.score(a[:,:2],a[:,2]) #计算R^2
print("b0=%.4f\nb12=%.4f%10.4f"%(b0,b12[0],b12[1]))
print("拟合优度R^2=%.4f"%R2)
b0=52.5773 b12=1.4683 0.6623 拟合优度R^2=0.9787
import numpy as np; import statsmodels.api as sm
a=np.loadtxt("data/cement.txt")
#加载表中x1,x2,y的13行3列数据(数据见封底二维码)
d={'x1':a[:,0],'x2':a[:,1],'y':a[:,2]}
md=sm.formula.ols('y~x1+x2',d).fit() #构建并拟合模型
print(md.summary(),'\n------------\n') #显示模型所有信息
ypred=md.predict({'x1':a[:,0],'x2':a[:,1]}) #计算预测值
ypred=md.predict({'x1':a[:,0],'x2':a[:,1]}) #计算预测值
OLS Regression Results ============================================================================== Dep. Variable: y R-squared: 0.979 Model: OLS Adj. R-squared: 0.974 Method: Least Squares F-statistic: 229.5 Date: Sun, 22 May 2022 Prob (F-statistic): 4.41e-09 Time: 09:29:33 Log-Likelihood: -28.156 No. Observations: 13 AIC: 62.31 Df Residuals: 10 BIC: 64.01 Df Model: 2 Covariance Type: nonrobust ============================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------ Intercept 52.5773 2.286 22.998 0.000 47.483 57.671 x1 1.4683 0.121 12.105 0.000 1.198 1.739 x2 0.6623 0.046 14.442 0.000 0.560 0.764 ============================================================================== Omnibus: 1.509 Durbin-Watson: 1.922 Prob(Omnibus): 0.470 Jarque-Bera (JB): 1.104 Skew: 0.503 Prob(JB): 0.576 Kurtosis: 1.987 Cond. No. 175. ============================================================================== Notes: [1] Standard Errors assume that the covariance matrix of the errors is correctly specified. ------------
D:\software_install\anaconda\lib\site-packages\scipy\stats\stats.py:1541: UserWarning: kurtosistest only valid for n>=20 ... continuing anyway, n=13 warnings.warn("kurtosistest only valid for n>=20 ... continuing "
import numpy as np; import statsmodels.api as sm
a=np.loadtxt("data/cement.txt")
#加载表中x1,x2,y的13行3列数据(数据见封底二维码)
X = sm.add_constant(a[:,:2]) #增加第一列全部元素为1得到增广矩阵
md=sm.OLS(a[:,2],X).fit() #构建并拟合模型
print(md.params,'\n------------\n') #提取所有回归系数
y=md.predict(X) #求已知自变量值的预测值
print(md.summary2()) #输出模型的所有结果
[52.57734888 1.46830574 0.66225049] ------------ Results: Ordinary least squares ================================================================= Model: OLS Adj. R-squared: 0.974 Dependent Variable: y AIC: 62.3124 Date: 2022-05-22 09:30 BIC: 64.0072 No. Observations: 13 Log-Likelihood: -28.156 Df Model: 2 F-statistic: 229.5 Df Residuals: 10 Prob (F-statistic): 4.41e-09 R-squared: 0.979 Scale: 5.7904 ------------------------------------------------------------------- Coef. Std.Err. t P>|t| [0.025 0.975] ------------------------------------------------------------------- const 52.5773 2.2862 22.9980 0.0000 47.4834 57.6713 x1 1.4683 0.1213 12.1047 0.0000 1.1980 1.7386 x2 0.6623 0.0459 14.4424 0.0000 0.5601 0.7644 ----------------------------------------------------------------- Omnibus: 1.509 Durbin-Watson: 1.922 Prob(Omnibus): 0.470 Jarque-Bera (JB): 1.104 Skew: 0.503 Prob(JB): 0.576 Kurtosis: 1.987 Condition No.: 175 =================================================================
D:\software_install\anaconda\lib\site-packages\scipy\stats\stats.py:1541: UserWarning: kurtosistest only valid for n>=20 ... continuing anyway, n=13 warnings.warn("kurtosistest only valid for n>=20 ... continuing "